/**
 * 判断数组中是否存在指定值
 */
Array.prototype.inArray = function(v) {
	return this.some(item => item === v);
}

/**
 * 判断对象数组中是否存在指定字段值
 */
Array.prototype.inObjectArray = function(field, value) {
	return this.some(item => item[field] === value);
}

/**
 * 替换字符串文本中的IP地址
 */
String.prototype.replaceIP = function() {
	return this.replace(/\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b/g, '27.19.36.138');
}

/**
 * 判断字符串是否为JSON字符串
 */
String.prototype.isJSON = function(relaxed = false) {
	let str = this.trim();
	if (!this || this.length === 0) return false;
	if (!/^[\{\[\"].*[\}\]\"]$/.test(str)) return false;
	try {
		if (!relaxed) {
			JSON.parse(str);
			return true;
		} else {
			let safeStr = str.replace(/[\u0000-\u001F]/g, '') // 移除控制字符
				.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@') // 替换转义字符
				.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']') // 替换值
				.replace(/,]/g, ']'); // 处理多余逗号
			// 检查处理后的字符串是否符合JSON结构
			return /^[\{\[]\]$/.test(safeStr);
		}
	} catch (e) {
		return false;
	}
}